#!/usr/bin/env ruby

#
#   Copyright 2011 Wade Alcorn wade@bindshell.net
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

require 'rubygems'

puts "\nWelcome to the BeEF installer!"

if  RUBY_VERSION < '1.9'
  puts "\n"
  puts "Ruby version " + RUBY_VERSION + " is no longer supported. Please upgrade 1.9 or later."
  puts ""
  puts "OSX:"
  puts "sudo port install ruby19 +nosuffix"
  puts "\n"
  exit
end

puts "\nPlease make sure you have installed SQLite before proceeding.  For instructions on how to do this please see the README file"

# array of required gems - add to as needed (specify a version if needed eg "gem_name, =x.x.x")
$gems_required = ["thin", "ansi", "term-ansicolor", "dm-core", "json", "data_objects", "do_sqlite3", "sqlite3", "dm-sqlite-adapter", 
                  "parseconfig", "erubis", "dm-migrations"]

# array of missing non-version specific gems installed
$gems_missing = Array.new

# array of missing version specific gems installed
$gems_missing_version = Array.new

# check all required gems (dependencies) are present
def dep_check
  $gems_required.each do |current_gem|
    begin
      if current_gem.include? ","
        tokens = current_gem.split(",")
        gem tokens[0], tokens[1]
      else
        gem current_gem
      end
    rescue Gem::LoadError
      if current_gem.include? ","
        $gems_missing_version << current_gem
      else
        $gems_missing << current_gem
      end
    end
  end
  if $gems_missing.length == 0 && $gems_missing_version.length == 0
    return true
  else
   return false
 end
end

# display install options
def display_opts
  puts "\n1) Install all required gems automatically\n" + "2) List required gems and exit so they can be installed manually\n" + "3) Exit installer\n\n"
  option = gets
  return option
end

# generate install command for missing gems
def install_command
  if (RUBY_PLATFORM =~ /linux/ or RUBY_PLATFORM =~ /darwin/) and Process.uid != 0
    cmd = "sudo gem install"
    $gems_missing.each do |current_gem|
      cmd = cmd + " #{current_gem}"
    end
    if $gems_missing_version.length != 0
      $gems_missing_version.each do |current_gem|
        if cmd == "sudo gem install"
          cmd = cmd + " #{current_gem}"
        else
          cmd = cmd + " && sudo gem install #{current_gem}"
        end
      end
    end
  else
    cmd = "gem install"
    $gems_missing.each do |current_gem|
      cmd = cmd + " #{current_gem}"
    end
    if $gems_missing_version.length != 0
      $gems_missing_version.each do |current_gem|
        if cmd == "gem install"
          cmd = cmd + " #{current_gem}"
        else
          cmd = cmd + " & gem install #{current_gem}"
        end
      end
    end
  end
  cmd = cmd.delete "," "'"
  cmd = cmd.gsub("=", "-v")
  cmd += " --no-rdoc --no-ri"
  return cmd
end

# install missing gems
def install_gems
  puts install_command + "\n"
  system(install_command)
end

dep_met = dep_check()

if dep_met == false
  puts "\nSome gems required by BEeF are not present on your system please select an option to continue:"
  option = display_opts
  while option != "1\n" and option != "2\n" and option != "3\n"
    puts "\nInvalid option entered, please select a valid option to continue:"
    option = display_opts
  end
  if option == "1\n"
    install_gems
  elsif option == "2\n"
    cmd = install_command
    puts "\nPlease run the following command to update and install all required gems:\n\n" + cmd + "\n\n"
  elsif option == "3\n"
    puts "\nExiting...\n\n"
  end
else
  puts "\nAll required gems are present - please run './beef' to start using BEeF\n\n"
  puts "\nThe Default username/password are beef/beef\n\n"
  puts "\nAll feedback welcome - http://beef.googlecode.com/\n\n"
end

puts "*** If you wish experiment with the shell interface ensure you also run:\nsudo gem install librex -v0.0.52 --no-rdoc --no-ri\n\n"
